Color OLED module library  v0.5
Library for the WaveShare 0.96-inch color OLED (SSD1331) module
ssd1331_scroll.c
1 
2 
3 
4 #include "ssd1331.h"
5 
6 void ssd1331_scrollDisplay(screen_t* dev, int h, int v) {
7 
8  int mask_cs = (1 << dev->dev_id);
9  int mask_sdi = (1 << dev->sdi_pin);
10  int mask_clk = (1 << dev->clk_pin);
11  int mask_dc = (1 << dev->dc_pin);
12 
13  // check rotation, move pixel around if necessary
14  switch (dev->rotation) {
15  case 1:
16  gfx_swap(v, h);
17  break;
18  case 2:
19  v = -v;
20  h = -h;
21  break;
22  case 3:
23  gfx_swap(v, h);
24  h = -h;
25  break;
26  }
27 
28 
29  if(h > dev->width) h = dev->width;
30  if(v > dev->height/2) v = dev->height/2;
31  if(h < 0 - dev->width) h = 0 - dev->width;
32  if(v < dev->height/(-2)) v = dev->height/(-2);
33 
34  if(h < 0) h = dev->width + h;
35  if(v < 0) v = dev->height + v;
36 
37  ssd1331_writeLockSet(dev->dev_id);
38 
39  if (v == 0 && h == 0) {
40  ssd1331_writeByte(mask_cs, mask_sdi, mask_clk, mask_dc, SSD1331_CMD_SCROLLSTOP, 0);
41  } else {
42  ssd1331_writeByte(mask_cs, mask_sdi, mask_clk, mask_dc, SSD1331_CMD_SCROLLSETUP, 0);
43 
44  ssd1331_writeByte(mask_cs, mask_sdi, mask_clk, mask_dc, (char) h, 0);
45  ssd1331_writeByte(mask_cs, mask_sdi, mask_clk, mask_dc, 0, 0);
46  ssd1331_writeByte(mask_cs, mask_sdi, mask_clk, mask_dc, dev->width << 1, 0);
47  ssd1331_writeByte(mask_cs, mask_sdi, mask_clk, mask_dc, (char) v, 0);
48  ssd1331_writeByte(mask_cs, mask_sdi, mask_clk, mask_dc, 0, 0); // speed?
49 
50  int _tMark = CNT + (CLKFREQ / 10000);
51  while(_tMark > CNT); // Wait for system clock target
52 
53  ssd1331_writeByte(mask_cs, mask_sdi, mask_clk, mask_dc, SSD1331_CMD_SCROLLSTART, 0);
54  }
55 
56  ssd1331_writeLockClear(dev->dev_id);
57 }